﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace PSZT
{
    public partial class NowaKlauzulaDialog : Form
    {
        List<Predykat> dostepnePredykaty;
        public Formula nowaFormula = new Formula();
        bool trybDoUdowodnienia = false;

        public NowaKlauzulaDialog(List<Predykat> dostepnePredykaty)
        {
            InitializeComponent();
            this.dostepnePredykaty = dostepnePredykaty;
            button3.Enabled = false;
        }

        public NowaKlauzulaDialog()
        {
            InitializeComponent();
            button3.Enabled = false;
        }

        

        private void button1_Click(object sender, EventArgs e)
        {
            string temp;
            string[] stringArray;
            Regex regex = new Regex(@"^(\w+, )*(\w+){1}$");
            if (!regex.IsMatch(textBox1.Text))
            {
                MessageBox.Show("Niepoprawna lista argumentów. Pamiętaj by argumenty oddzielić przecinkiem i spacją. Np.: arg1, arg2, ARG3", "Popraw argumenty", MessageBoxButtons.OK);
                return;
            }

            temp = textBox1.Text.Trim();
            stringArray = temp.Split(new Char[] { ',' });

            int liczbaArg = 0;
            foreach (Predykat pred in dostepnePredykaty)
            {
                if (pred.nazwa == comboBox1.SelectedItem.ToString())
                {
                    liczbaArg = pred.liczbaArgumentow;
                    break;
                }
            }
            if (stringArray.Count() != liczbaArg)
            {
                MessageBox.Show("Niewłaściwa liczba argumentów!", "Popraw argumenty", MessageBoxButtons.OK);
            }

            Predykat nowyPredykat = new Predykat(comboBox1.SelectedItem.ToString(), liczbaArg);
            foreach (string s in stringArray)
            {
                nowyPredykat.argumenty.Add(s);
            }
            if (nowyPredykat.czyPrawidlowy(nowyPredykat))
            {
                nowaFormula.przeslanki.Add(nowyPredykat);
                label3.Text += nowyPredykat.ToString() + " ^ ";
            }
        }

        private void NowaKlauzulaDialog_Load(object sender, EventArgs e)
        {
            foreach(Predykat pred in dostepnePredykaty)
            {
                comboBox1.Items.Add(pred.nazwa);
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            foreach (Predykat pred in dostepnePredykaty)
            {
                if (pred.nazwa == comboBox1.SelectedItem.ToString())
                {
                    label2.Text = "Argumenty (" + pred.liczbaArgumentow.ToString() + "):";
                    break;
                }
            }
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string temp;
            string[] stringArray;
            Regex regex = new Regex(@"^(\w+, )*(\w+){1}$");
            if (!regex.IsMatch(textBox1.Text))
            {
                MessageBox.Show("Niepoprawna lista argumentów. Pamiętaj by argumenty oddzielić przecinkiem i spacją. Np.: arg1, arg2, ARG3", "Popraw argumenty", MessageBoxButtons.OK);
                return;
            }

            temp = textBox1.Text.Trim();
            stringArray = temp.Split(new Char[] { ',' });

            int liczbaArg = 0;
            foreach (Predykat pred in dostepnePredykaty)
            {
                if (pred.nazwa == comboBox1.SelectedItem.ToString())
                {
                    liczbaArg = pred.liczbaArgumentow;
                    break;
                }
            }
            if (stringArray.Count() != liczbaArg)
            {
                MessageBox.Show("Niewłaściwa liczba argumentów!", "Popraw argumenty", MessageBoxButtons.OK);
                return;
            }

            Predykat nowyPredykat = new Predykat(comboBox1.SelectedItem.ToString(), liczbaArg);
            foreach (string s in stringArray)
            {
                nowyPredykat.argumenty.Add(s);
                if (trybDoUdowodnienia && Predykat.czyZmienna(s))
                {
                    MessageBox.Show("Dodajesz zdanie do udowodnienia: nie możesz podać zmiennych jako argumenty", "Popraw argumenty", MessageBoxButtons.OK);
                    return;
                }
            }
            if (nowyPredykat.czyPrawidlowy(nowyPredykat))
            {
                nowaFormula.konkluzja = nowyPredykat;
                if (label3.Text.Count() > 0)
                {
                    label3.Text = label3.Text.Remove(label3.Text.Count() - 2);
                    label3.Text += "=> " + nowyPredykat.ToString();
                    //nowaFormula.czyAtom = false;
                }
                else
                {
                    label3.Text = nowyPredykat.ToString();
                    //nowaFormula.czyAtom = true;
                }
                button1.Enabled = false;
                button2.Enabled = false;
                button3.Enabled = true;
            }
        }

        public void wylaczPrzyciskPrzeslanek()
        {
            button1.Enabled = false;
            trybDoUdowodnienia = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Hide();
        }
    }
}
